﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;
using System.Web.Helpers;
using System.IO;



namespace TumbaloSoft.Controllers
{
    public class InmuebleController : TumbaloController
    {
        private static Object lockObject = new Object();
        //
        // GET: /Inmueble/

        public ActionResult Index(BusquedaInmueble inmuebleBuscar)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList listaDistritos = null;
                int numActivos = 0;
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                ViewBag.Monedas = HelperMoneda.selectAll();

                listaDistritos = HelperDistrito.selectAll();
                numActivos = HelperInmueble.selectCountActivos();
                if (inmuebleBuscar.prTipoInmueble == null)
                {
                    inmuebleBuscar.prTipoInmueble = new TipoInmueble();
                    inmuebleBuscar.prTipoInmueble.prIdTipoInmueble = 0;
                }
                ViewBag.ListaInmueble = HelperInmueble.buscar(inmuebleBuscar);

                ViewBag.prevPage = inmuebleBuscar.prPage - 1;
                ViewBag.nextPage = inmuebleBuscar.prPage + 1;
                ViewBag.numPages = numActivos / inmuebleBuscar.prPageSize;
                if ((numActivos % inmuebleBuscar.prPageSize) > 0) ViewBag.numPages++;

                ViewBag.listaDistritos = listaDistritos;

                return View(inmuebleBuscar);
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al visualizar la lista de inmuebles", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        public ActionResult Registrar(int? prIdPersona)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                if (prIdPersona.HasValue)
                {
                    ViewBag.idPersona = prIdPersona;
                }
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }

                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                //ViewBag.codigo = codigo;
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                return View();
            }
            catch(Exception ex) {
                Logger.Current.Error("Error al registrar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

        [HttpPost]
        public ActionResult Registrar(Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                //Llamar a todas las listas que se utilizan
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                //Todo lo anterior es por si sale algun error del tipo Null Reference, que representa el llamado a todas las listas usadas en el ActionResult MI_nuevo()

                inm.prEstado = "REGISTRADO";


                var image = WebImage.GetImageFromRequest();
                var filename = Path.GetFileName(image.FileName);
                var extension = Path.GetExtension(image.FileName);

                ModelState.Remove("prDuenho.prDireccion");
                if (ModelState.IsValid)
                {

                    filename = inm.prDuenho.prIdPersona + "-" + inm.prIdInmueble + "-" + inm.prTipoInmueble.prIdTipoInmueble + "" + extension;
                    var path = Path.Combine(Server.MapPath("../Imagenes/Inmuebles/"), filename);
                    image.Save(path);
                    inm.prImagen = Url.Content(Path.Combine("../Imagenes/Inmuebles/", filename));

                    lock (lockObject)
                    {
                        inm.prIdInmueble = HelperInmueble.SiguienteCodigo();
                        HelperInmueble.insert(inm);
                        ViewBag.mensaje = "Se registro correctamente el inmueble";
                        ViewBag.returnURL = "/Inmueble/Index";
                        return View("~/Views/Shared/Exito.cshtml");
                    }
                    
                }
                else return View(inm);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al registrar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

              

        public ActionResult Modificar(int? prIdInmueble)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();
                if (!prIdInmueble.HasValue) return View();//se llamo sin parametro deberia devolver error
                Inmueble inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                if (inmueble == null) return View();

                return View(inmueble);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al modificar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }

        }

        [HttpPost]
        public ActionResult Modificar(Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();



                if (ModelState.IsValid)
                {
                    HelperInmueble.update(inm);
                    ViewBag.mensaje = "Se modifico correctamente el inmueble";
                    ViewBag.returnURL = "/Inmueble/Index";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                else return View(inm);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al modificar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

	   

        public ActionResult Eliminar(int? prIdInmueble)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();

                if (!prIdInmueble.HasValue) return View();//se llamo sin parametro deberia devolver error
                Inmueble inmueble = HelperInmueble.selectById(prIdInmueble.Value);
                if (inmueble == null) return View();//si el inmueble no se encontro//tambien deberia devolver error
                return View(inmueble);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al eliminar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }


        [HttpPost]
        public ActionResult Eliminar (Inmueble inm)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                ViewBag.listaTipoInmueble = HelperTipoInmueble.selectAll();
                List<Int32> listaAnhos = new List<Int32>();

                for (int i = 0; i < 80; i++)
                {
                    listaAnhos.Add(Int32.Parse(DateTime.Now.Year.ToString()) - i);
                }
                ViewBag.listaAnhos = listaAnhos;
                ViewBag.listaDistrito = HelperDistrito.selectAll();

                if (ModelState.IsValid)
                {
                    HelperInmueble.delete(inm);
                    ViewBag.mensaje = "Se elimino correctamente el inmueble";
                    ViewBag.returnURL = "/Inmueble/Index";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                else return View(inm);
            }
            catch(Exception ex) {

                Logger.Current.Error("Error al eliminar un inmueble", ex);
                return View("~/Views/Shared/Error.cshtml"); 
            }
        }

	   public ActionResult BuscarClienteIndex()
	   {
           if (defaultAction != null) return defaultAction;
           try
           {
               return View();
           }
           catch (Exception ex)
           {
               Logger.Current.Error("Error al intentar cargar la pagina", ex);
               return View("~/Views/Shared/Error.cshtml");
           }
	   }


	   [HttpPost]
	   public ActionResult BuscarClienteIndex(string tipoPersona)
	   {
           if (defaultAction != null) return defaultAction;
           try
           {
               if (tipoPersona == "N") return RedirectToAction("IndexPersonaNatural");
               else return RedirectToAction("IndexPersonaJuridica");
           }
           catch (Exception ex)
           {
               Logger.Current.Error("Error al intentar cargar la pagina", ex);
               return View("~/Views/Shared/Error.cshtml");
           }
	   }

	   public ActionResult IndexPersonaNatural(BusquedaPersonaNatural personaNaturalBuscar)
	   {
           if (defaultAction != null) return defaultAction;           
           int numActivos = 0;

		   try
		   {
			   numActivos = HelperPersonaNatural.selectCountActivos();
			   ViewBag.ListaPersonaNatural = HelperPersonaNatural.buscar(personaNaturalBuscar);
		   }
		   catch (Exception ex)
		   {
               Logger.Current.Error("Error al visualizar persona natural", ex);
               return View("~/Views/Shared/Error.cshtml"); 
		   }

		   ViewBag.prevPage = personaNaturalBuscar.prPage - 1;
		   ViewBag.nextPage = personaNaturalBuscar.prPage + 1;
		   ViewBag.numPages = numActivos / personaNaturalBuscar.prPageSize;
		   if ((numActivos % personaNaturalBuscar.prPageSize) > 0) ViewBag.numPages++;

		   return View(personaNaturalBuscar);
	   }

	   public ActionResult IndexPersonaJuridica(BusquedaPersonaJuridica personaJuridicaBuscar)
	   {
           if (defaultAction != null) return defaultAction;           
		   int numActivos = 0;

		   try
		   {
			   numActivos = HelperPersonaJuridica.selectCountActivos();
			   ViewBag.ListaPersonaJuridica = HelperPersonaJuridica.buscar(personaJuridicaBuscar);
		   }
		   catch (Exception ex)
		   {
               Logger.Current.Error("Error al visualizar una persona juridica", ex);
               return View("~/Views/Shared/Error.cshtml"); 
		   }

		   ViewBag.prevPage = personaJuridicaBuscar.prPage - 1;
		   ViewBag.nextPage = personaJuridicaBuscar.prPage + 1;
		   ViewBag.numPages = numActivos / personaJuridicaBuscar.prPageSize;
		   if ((numActivos % personaJuridicaBuscar.prPageSize) > 0) ViewBag.numPages++;

		   return View(personaJuridicaBuscar);
	   }


    }
}
